package dao

import "github.com/astaxie/beego/orm"

// 这是 PmsProductCategory 的全局公开dao对象，被service层调用!
var PmsProductCategoryDao = pmsProductCategoryDao{}

// 这是 pms_product_category表 的实体类
type PmsProductCategory struct {
	ParentId    int64  `json:"parent_id" form:"parent_id" v:"parent_id"` // 上一级分类的编号: 0表示一级分类，外键自关联
	Name        string `json:"name" form:"name" v:"name"`
	ProductUnit string `json:"product_unit" form:"product_unit" v:"product_unit"`
	NavStatus   int32  `json:"nav_status" form:"nav_status" v:"nav_status"`    // 是否显示在导航栏：0-&gt;不显示；1-&gt;显示
	ShowStatus  int32  `json:"show_status" form:"show_status" v:"show_status"` // 显示状态：0-&gt;不显示；1-&gt;显示
	Sort        int32  `json:"sort" form:"sort" v:"sort"`
	Icon        string `json:"icon" form:"icon" v:"icon"` // 图标
	Keywords    string `json:"keywords" form:"keywords" v:"keywords"`
	Description string `json:"description" form:"description" v:"description"` // 描述

	Level        int32 `json:"level" form:"level" v:"level"` // 分类级别：0-&gt;1级；1-&gt;2级
	ProductCount int32 `json:"product_count" form:"product_count" v:"product_count"`
	Id           int64 `json:"id" form:"id" v:"id"`
}

// 注意:这是 PmsProductCategory 的私有dao对象，只能在dao层内使用!
type pmsProductCategoryDao struct {
	InsertTemplate   func(arg PmsProductCategoryParam) (int64, error)               //插入一条记录
	UpdateTemplate   func(arg PmsProductCategoryParam) (int64, error)               //更新一条记录
	DeleteTemplate   func(id int64) (int64, error)                                  `args:"id"` //根据传入的主键删除一条记录
	SelectTemplate   func(id int64) (PmsProductCategory, error)                     `args:"id"` //根据传入的主键获取一条记录
	List             func(arg PmsProductCategoryList) ([]PmsProductCategory, error) //模糊分页查询
	UpdateShowStatus func(ids []int64, showStatus int32) (int64, error)             `args:"ids,show_status"`
	UpdateNavStatus  func(ids []int64, navStatus int32) (int64, error)              `args:"ids,nav_status"`
}

/*
// 这是 pms_product_category 表的Postman测试参数
// 该结构体中的字段就是: 前后端交互的json字段!
type PmsProductCategoryPostman struct {
description
icon
id
keywords
level
name
nav_status
parent_id
product_count
product_unit
show_status
sort

}*/

type PmsProductCategoryParam struct {
	//ParentId     int64   `json:"parent_id" form:"parent_id" v:"parent_id"` // 上一级分类的编号: 0表示一级分类，外键自关联
	//Name         string  `json:"name" form:"name" v:"name"`
	//ProductUnit  string  `json:"product_unit" form:"product_unit" v:"product_unit"`
	//NavStatus    int32   `json:"nav_status" form:"nav_status" v:"nav_status"`    // 是否显示在导航栏：0;不显示；1;显示
	//ShowStatus   int32   `json:"show_status" form:"show_status" v:"show_status"` // 显示状态：0;不显示；1;显示
	//Sort         int32   `json:"sort" form:"sort" v:"sort"`
	//Icon         string  `json:"icon" form:"icon" v:"icon"` // 图标
	//Keywords     string  `json:"keywords" form:"keywords" v:"keywords"`
	//Description  string  `json:"description" form:"description" v:"description"` // 描述
	PmsProductCategory
	AttributeIds []int64 `json:"attribute_ids" form:"attribute_ids"` //商品属性的ID集合
}

type PmsProductCategoryList struct {
	ParentId int64 `json:"parent_id" form:"parent_id" v:"parent_id"`
	Page
}

// 树形结构
type PmsProductCategoryNode struct {
	ParentId     int64                     `json:"parent_id" form:"parent_id" v:"parent_id"` // 上一级分类的编号: 0表示一级分类，外键自关联
	Name         string                    `json:"name" form:"name" v:"name"`
	ProductUnit  string                    `json:"product_unit" form:"product_unit" v:"product_unit"`
	NavStatus    int32                     `json:"nav_status" form:"nav_status" v:"nav_status"`    // 是否显示在导航栏：0-&gt;不显示；1-&gt;显示
	ShowStatus   int32                     `json:"show_status" form:"show_status" v:"show_status"` // 显示状态：0-&gt;不显示；1-&gt;显示
	Sort         int32                     `json:"sort" form:"sort" v:"sort"`
	Icon         string                    `json:"icon" form:"icon" v:"icon"` // 图标
	Keywords     string                    `json:"keywords" form:"keywords" v:"keywords"`
	Description  string                    `json:"description" form:"description" v:"description"` // 描述
	Level        int32                     `json:"level" form:"level" v:"level"`                   // 分类级别：0-&gt;1级；1-&gt;2级
	ProductCount int32                     `json:"product_count" form:"product_count" v:"product_count"`
	Id           int64                     `json:"id" form:"id" v:"id"`
	Children     []*PmsProductCategoryNode `json:"children"`
}

// 使用beego中的orm模块实现自关联查询
func (m *PmsProductCategory) ListWithChildren() ([]*PmsProductCategoryNode, error) {
	return m.GetNode(0)
}

//递归获取树形结构
func (m *PmsProductCategory) GetNode(parentId int64) ([]*PmsProductCategoryNode, error) {
	o := orm.NewOrm()
	var list []PmsProductCategory
	//menu, err := UmsMenuDao.SelectByParentId(parentId)
	//获取parentId的所有子菜单
	o.QueryTable("pms_product_category").Filter("parent_id", parentId).OrderBy("sort").All(&list)

	tree := make([]*PmsProductCategoryNode, 0)
	for _, item := range list {
		child, _ := item.GetNode(item.Id) //获取parentId每一个子菜单的子菜单
		node := &PmsProductCategoryNode{
			ParentId:     item.ParentId,
			Name:         item.Name,
			ProductUnit:  item.ProductUnit,
			NavStatus:    item.NavStatus,
			ShowStatus:   item.ShowStatus,
			Sort:         item.Sort,
			Icon:         item.Icon,
			Keywords:     item.Keywords,
			Description:  item.Description,
			Level:        item.Level,
			ProductCount: item.ProductCount,
			Id:           item.Id,
		}
		node.Children = child
		tree = append(tree, node)
	}
	return tree, nil
}
